#ifndef __UNIT_HPP__
#define __UNIT_HPP__

#include <vector>
#include <string>

// 工具类文件
namespace qihai
{
    // 字符流处理类
    struct StreamProcess
    {
        // 压缩字符串，将字符串的前面和后面空格清除掉
        static void CompressStr(std::string& str)
        {
            size_t begin = 0, end = str.size() - 1;
            while (begin < end && \
                  (str[begin] == ' ' || str[end] == ' '))
            {
                if (str[begin] == ' ') begin++;
                if (str[end] == ' ') end--;
            }
            str = str.substr(begin, end - begin + 1);
        }

        // 分割字符串
        // str 待切割字符串 mark 切割的标志 cont 待切割完存放的数组(push_back)
        // 比如: mark=" ",str = "ab c d" cont = {"ab", "c", "d"};
        // v1.2 compressStr选项表示是否压缩字符串 即对每个切分的字符串将其中的空格去除(注意只是分割符距离单词的空格)
        // 比如："  abc d \r\n" 得出的结果为"abc d" 如果此选项为false，则切分的结果为"  abc d "
        static void SlicedString(const std::string& str, const std::string& mark, std::vector<std::string>& cont, bool compressStr = false)
        {
            size_t markLen = mark.size(), strLen = str.size();
            size_t begin = 0, end = 0;
            std::string tmp;
            while (end < strLen)
            {
                end = str.find(mark, begin);  // 从begin下标开始找到标志位，返回找到的下标
                if (end == std::string::npos) end = strLen;// 没找到
                if (end != begin)
                {
                    tmp = str.substr(begin, end - begin);
                    if (compressStr) CompressStr(tmp);
                    cont.push_back(tmp);  // 切分一位
                }
                begin = end + markLen;
            }
        }
    };
}
#endif